package 反射;

import java.lang.reflect.Field;
import java.util.Arrays;

public class 获取成员变量 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        //1.获取类的字节码文件的对象
        Class<?> aClass = Class.forName("反射.Student");

        //2.获取成员变量
        //getFields获取到公共的成员变量并添加到数组中
        Field[] fields = aClass.getFields();
        System.out.println(Arrays.toString(fields));

        //getDeclaredFields获取所有的成员变量添加到数组中
        Field[] declaredFields = aClass.getDeclaredFields();

        //获取单个的成员变量
        //getField:获取公共的指定的成员变量--同理加上Declared就可以获取所有类型的成员变量
        Field gender = aClass.getField("gender");

        //获取成员变量的权限修饰符-->getModifiers同样返回的是修饰符的的数值
        int modifiers = gender.getModifiers();

        //获取成员变量名的名字
        String name = gender.getName();
        System.out.println(name);

        //获取成员变量的数据类型
        Class<?> type = gender.getType();
        System.out.println(type);

        //获取成员变量记录的值
        Student stu=new Student("张三",23);
        Field n = aClass.getDeclaredField("name");
        n.setAccessible(true);
        Object o = n.get(stu);
        System.out.println(o);

        //修改对象里面记录的值
        n.set(stu,"李四");
        System.out.println(stu);//Student{name = 李四, age = 23}


    }
}
